iT邦幫忙

2024 iThome 鐵人賽

DAY 14
0
自我挑戰組

硬體學習日記系列 第 14

Day-14 Verilog介紹-10 條件&迴圈

  • 分享至 

  • xImage
  •  

今天要來介紹的是verilog的條件及迴圈語法~是比較簡單的部份,這兩個對大家來說應該都不陌生XD雖然是大家都熟悉的東西,但因為是初學verilog,還是想寫寫看他的範例~雖然感覺跟C真的差不多XD

條件(if-else)

就是根據條件來選擇要執行什麼任務啦~
語法結構就像寫C一樣,只是多了begin、end包住欲執行的指令。

if(condition)begin
	//欲執行動作
end

else if(condition)begin
	//欲執行動作
end

else begin
	//上面條件都不成立時,執行這裡的指令
end

跟C真的很像吧XD
接著就來點舉例啦~

module newwork(A,B,C);
	input wire [3:0] A,B;
	output reg [3:0] C;
	
	always @(*)begin
		if( A > B )begin
			C = A;
		end
		else begin
			C = B;
		end
	end
	
endmodule

這是一個很簡單的比較A、B兩個信號,把值較大的傳給C。

module newwork(A,C);
	input wire [3:0] A;
	output reg [3:0] C;
	
	always @(*)begin
		if( A == 4'b0001 )begin
			C = 4'b1110;
		end
		else if( A == 4'b0101 )begin
			C = 4'b1010;
		end
		else if( A == 4'b1100 )begin
			C = 4'b0011;
		end
		else begin
			C = 4'b0000;
		end
	end
	
endmodule

這一個則是根據A的數值來決定C要存取的值是多少,如果A不符合某三個特定值,C則為0。

迴圈

迴圈的部分有for、while及repeat,repeat應該是比較少被使用到的部分,畢竟我平常自己寫
程式都只有用for及while XD看身邊的人也很少在用repeat。

for

首先先來看for~跟C語言差不多,就直接打語法結構跟範例了~

for( initialization; condition; increment/decrement )begin
	//loop body
end

欸,當我在自己練習打舉例時,我發現verilog的for跟C還是有蠻大的差異耶。
在C中,for迴圈可以直接寫在main裡,但在verilog,如果for直接寫在module然後沒有寫在initial、always之類的裡面,就會編譯錯誤。

大概就是:

沒有用initial包住:

module newwork(A,C);
	input wire A;
	output reg C;
	integer i;
	
	for( i = 0; i < 10; i = i + 1 )begin
		C = A << 1;
	end
	
endmodule

有用initial包住:

module newwork(A,C);
	input wire A;
	output reg C;
	integer i;
	
	initial begin
	
		for( i = 0; i < 10; i = i + 1 )begin
			C = A << 1;
		end
	
	end
	
endmodule

就根據需求來選擇要使用initial或always啦~目前用這兩個是都能夠成功執行的!

喔對,還有一個與C的差異是,最後面( i = i + 1 )的部分,在C可以直接寫( ++i ),但在verilog中似乎會編譯錯誤(我自己寫的時候會)。
如果需要用for迴圈來進行初始化的工作,那就會寫在initial裡;always則是在特定條件達成後開始執行,如果有要求在某條件下啟動迴圈就用always。

那還有一個很常見的是使用generate來行使迴圈,他的結構長這樣:

genvar i;
generate
	for( i = 0; i < 4; i = i + 1 ) begin: gen_block //gen_block為這個區塊的名稱
		//for_loop body
	end
endgenerate

最後就是for也可以寫在之前介紹過的task及function中,每呼叫一次task或function,就會執行一次for迴圈。

while

再來是while迴圈的部分,他跟for功能都是在滿足一定的條件下,重複執行區塊內的指令,宣告方式那些的也都跟C語言差不多,這是他的結構:

while( condition )begin
	//loop body
end

while的括號內只需要寫條件就可以了,所以可能要注意一下有沒有在迴圈內寫入可以讓迴圈停止的條件,否則可能會因為變成無窮迴圈而產生錯誤喔~

舉個小例子:

module newwork(C);
	output C;
	reg Q;
	integer i;
	
	initial begin
		i = 0;
		Q = 1;
		while( i < 3 ) begin
			Q = Q << i;
			i = i + 1;
		end
	end
	
	assign C = Q;
	
endmodule

這個迴圈中,停止條件是當i的值大於或等於3的時候。迴圈每執行一次,i值就會+1,且Q的值會左移i格。

那while跟for一樣,都要寫在initial、awlays等區塊內,不能直接寫在module裡喔~

repeat

最後一個迴圈是repeat~這個在C中應該是沒有看過XD我是沒看過啦,那來看看他的特性跟結構吧~
repeat與for、while功能一樣就是重複執行特定指令,那他跟for及while不同的地方是,repeat不需要條件或increment,只要給一個執行次數就可以了。他通常被用在特定情況下的重複操作,例如clock脈衝的module。
結構是這樣:

repeat(次數)begin
	//loop body
end

那來舉個小例子:

module newwork(C);
	output C;
	reg Q;
	integer i;
	
	initial begin
		i = 0;
		Q = 0;
		
		repeat(10)begin
			i = i + 1;
			Q = Q + i;
		end
	
	end
	
	assign C = Q;

endmodule

在這個例子中,repeat會執行10次,每一次i的值都會+1、Q的值都會加上i的值,所以i最後的值會是10、Q最後的值會是55。
repeat一樣要寫在initial、always、generate等區塊內,不然會編譯錯誤。

那今天就這樣~謝謝。


上一篇
Day-13 Verilog介紹-9 Case
下一篇
Day-15 FPGA簡介
系列文
硬體學習日記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言